﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Text.RegularExpressions;

namespace ChequeManagement.Validation
{
    public class ValidationRule
    {

        #region NameIsValid
        private string customMessageForNameIsValid = string.Empty;
        private string customMessageIfNameIsNull = string.Empty;
        private DefaultForNameIsValid defaultMessageForNameIsValid;
        private bool nameIsNullable = false;

        /// <summary>
        /// this method validate naming variables. you can select default messages in DefaultMessageForNameIsValid property
        /// or you can write your custom mesaage in CustomMessageForNameIsValid property
        /// </summary>
        /// <param name="name">the name that you want to validate</param>
        /// <param name="lowerBound">the lower bound of the name should be</param>
        /// <param name="upperBound">the upper bound of the name should be</param>
        /// <param name="message">save the mesage error to this parameters. be carefull that is out parameter</param>
        /// <returns>if successful return true else return false</returns>
        public bool NameIsValid(string name, int lowerBound, int upperBound, out string message)
        {
            if (string.IsNullOrEmpty(name) && NameIsNullable)
            {
                if (DefaultMessageForNameIsValid == DefaultForNameIsValid.Description)
                    message = String.Format("فیلد توضیحات نباید خالی باشد");
                else if (DefaultMessageForNameIsValid == DefaultForNameIsValid.Bank)
                    message = String.Format("فیلد بانک نباید خالی باشد");
                else if (DefaultMessageForNameIsValid == DefaultForNameIsValid.Branch)
                    message = String.Format("فیلد شعبه نباید خالی باشد");
                else if (DefaultMessageForNameIsValid == DefaultForNameIsValid.Drawer)
                    message = String.Format("فیلد توضیحات نباید خالی باشد");
                else if (DefaultMessageForNameIsValid == DefaultForNameIsValid.Name)
                    message = String.Format("فیلد نام نباید خالی باشد");
                else if (string.IsNullOrEmpty(CustomMessageForNameIsValid))
                    message = CustomMessageIfNameIsNull;
                else
                    message = String.Format("فیلد نام نباید خالی باشد");

                return false;
            }

            if (name.Length < upperBound && name.Length > lowerBound)
            {
                message = string.Empty;
                return true;
            }
            else
            {

                if (DefaultMessageForNameIsValid == DefaultForNameIsValid.Description)
                    //message = String.Format("{0} {1} , {2} {3}", "فیلد توضیحات باید بین", lowerBound.ToString(), upperBound.ToString(), "کاراکتر باشد");
                    message=String.Format("طول فیلد توضیحات باید بین {0} و {1} کاراکتر باشد", lowerBound.ToString(), upperBound.ToString());
                else if (DefaultMessageForNameIsValid == DefaultForNameIsValid.Bank)
                    message = String.Format("طول فیلد بانک باید بین {0} و {1} کاراکتر باشد", lowerBound.ToString(), upperBound.ToString());
                else if (DefaultMessageForNameIsValid == DefaultForNameIsValid.Branch)
                    message = String.Format("طول فیلد شعبه باید بین {0} و {1} کاراکتر باشد", lowerBound.ToString(), upperBound.ToString());
                else if (DefaultMessageForNameIsValid == DefaultForNameIsValid.Drawer)
                    message = String.Format("طول فیلد نام طرف حساب باید بین {0} و {1} کاراکتر باشد", lowerBound.ToString(), upperBound.ToString());
                else if (DefaultMessageForNameIsValid == DefaultForNameIsValid.Name)
                    message = String.Format("طول فیلد نام باید بین {0} و {1} کاراکتر باشد", lowerBound.ToString(), upperBound.ToString());
                else if (string.IsNullOrEmpty(CustomMessageForNameIsValid))
                    message = CustomMessageForNameIsValid;
                else
                    message = String.Format("طول فیلد نام باید بین {0} و {1} کاراکتر باشد", lowerBound.ToString(), upperBound.ToString());
                    

                return false;
            }
        }

        public bool NameIsNullable
        {
            get
            {
                return nameIsNullable;
            }
            set
            {
                nameIsNullable = value;
            }
        }
        public string CustomMessageIfNameIsNull
        {
            get
            {
                return customMessageIfNameIsNull;
            }
            set
            {
                customMessageIfNameIsNull = value;
            }
        }


        public enum DefaultForNameIsValid
        {
            /// <summary>
            /// <para>طول فیلد نام باید بین "پارامتر دوم" و "پارامتر سوم"  کاراکتر باشد</para>
            /// <para>فیلد نام نمی تواند خالی باشد</para>
            /// </summary>
            Name,
            /// <summary>
            /// <para>طول فیلد توضیحات باید بین "پارامتر دوم" و "پارامتر سوم" کاراکتر باشد</para>
            /// <para>فیلد توضیحات نمی تواند خالی باشد</para>
            /// </summary>
            Description,
            /// <summary>
            /// طول فیلد بانک باید بین "پارامتر دوم" و "پارامتر سوم" کاراکتر باشد
            /// فیلد بانک نمی تواند خالی باشد
            /// </summary>
            Bank,
            /// <summary>
            /// طول فیلد نام طرف حساب باید بین "پارامتر دوم" و "پارامتر سوم" کاراکتر باشد
            /// فیلد نام طرف حساب نمی تواند خالی باشد
            /// </summary>
            Drawer,
            /// <summary>
            /// طول فیلد شعبه باید بین "پارامتر دوم" و "پارامتر سوم" کاراکتر باشد
            /// فیلد شعبه نمی تواند خالی باشد
            /// </summary>
            Branch
            
        }

        public DefaultForNameIsValid DefaultMessageForNameIsValid
        {
            get
            {
                return defaultMessageForNameIsValid;
            }
            set
            {
                if (string.IsNullOrEmpty(CustomMessageForNameIsValid))
                {
                    defaultMessageForNameIsValid = value;
                }
            }
        }
        public string CustomMessageForNameIsValid
        {
            get
            {
                return customMessageForNameIsValid;
            }
            set
            {
                customMessageForNameIsValid = value;
            }
        }
        #endregion

        #region AddressIsValid
        private string customMessageForAddressIsValid;
        private DefaultAddressIsValid defaultMessageForAddressIsValid;
        public bool AddressIsValid()
        {
            return false;
        }
        public enum DefaultAddressIsValid
        {

        }
        public DefaultAddressIsValid DefaultMessageForAddressIsValid
        {
            get
            {
                return defaultMessageForAddressIsValid;
            }
            set
            {
                if (string.IsNullOrEmpty(CustomMessageForAddressIsValid))
                {
                    defaultMessageForAddressIsValid = value;
                }
            }
        }
        public string CustomMessageForAddressIsValid
        {
            get
            {
                return customMessageForAddressIsValid;
            }
            set
            {
                customMessageForAddressIsValid = value;
            }
        }
        #endregion

        #region DateIsValid
        private string customMessageForDateIsValid = string.Empty;
        private DefaultDateIsValid defaultMessageForDateIsValid;
        public bool DateIsValid(string date,DefaultDateIsValid calendarType)
        {
            if (calendarType == DefaultDateIsValid.Jalali)
            {                
                // Example:     string date = "1390/05/29";
                Regex dateExpression = new Regex(@"^(13[0-9][0-9])[- /.](0[1-9]|1[012])[- /.](0[1-9]|[12][0-9]|3[01])");// for Jalali calendar like 13xx/xx/xx
                if (dateExpression.Match(date).Success)
                    return false;
                else
                    return true;
            }
            else
            {
                // Example:     string date = "05-21-2011";
                Regex dateExpression = new Regex(@"^(0[1-9]|1[012])[- /.](0[1-9]|[12][0-9]|3[01])[- /.](19|20)\d\d$");// for Gregorian calendar Like mm/dd/yyyy
                if (dateExpression.Match(date).Success)
                    return false;
                else
                    return true;
            }
        }
        public enum DefaultDateIsValid
        {
            Jalali,
            Gregorian
        }
        public DefaultDateIsValid DefaultMessageForDateIsValid
        {
            get
            {
                return defaultMessageForDateIsValid;
            }
            set
            {
                if (string.IsNullOrEmpty(CustomMessageForDateIsValid))
                {
                    defaultMessageForDateIsValid = value;
                }
            }
        }
        public string CustomMessageForDateIsValid
        {
            get
            {
                return customMessageForDateIsValid;
            }
            set
            {
                customMessageForDateIsValid = value;
            }
        }
        #endregion
    }
}
